/* Declaracao visando identificar o modulo como servidor. */

#define SERVIDOR_PERSISTENCIA_USUARIOS



/* Inclusao de arquivo com a declaracao da interface. */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "interface_persistencia.h"





/* Definicao do corpo da funcao. */


void Ler_Usuario_BD(FILE *file, char nome_leitura[11], char senha_leitura[7], char identificador_leitura[6])
{
	int i;
	char c = '\0';

	while ((c == '\0') || (c == '\t') || (c == '\n') || (c == EOF))
	{
		if (c == EOF)
			return;
		c = fgetc(file);
	}

	i = 0;
	while ((c != '\t') && (c != '\n') && (c != '\0'))
	{
		nome_leitura[i] = c;
		i++;
		c = fgetc(file);
	}
	nome_leitura[i] = '\0';

	i = 0;
	c = fgetc(file);
	while ((c != '\t') && (c != '\n') && (c != '\0'))
	{
		senha_leitura[i] = c;
		i++;
		c = fgetc(file);
	}
	senha_leitura[i] = '\0';

	i = 0;
	c = fgetc(file);
	while ((c != '\t') && (c != '\n') && (c != '\0'))
	{
		identificador_leitura[i] = c;
		i++;
		c = fgetc(file);
	}
	identificador_leitura[i] = '\0';
	fgetc(file);
}




int cadastrar_usuario_persistencia(char nome_de_usuario[11], char senha[7], int identificador)
{
	FILE *file;
	int status = -1;

	//Verifica se o arquivo existe, se nao existe cria
	file = fopen(DATABASE_USUARIOS, "r+");
	if (!file)
		file = fopen(DATABASE_USUARIOS, "w");

	//Vai para o final do arquivo e escreve os dados do usuario nele
	fseek(file, 0, SEEK_END);
	status = fprintf(file, "%s\t%s\t%d\t\n", nome_de_usuario, senha, identificador);
	fclose(file);

	return status;
}


int autenticar_usuario_persistencia(char nome_de_usuario[11], char senha[7])
{
	FILE *file;
	int identificador = -1;
	bool achou = false;
	char nome_leitura[11], senha_leitura[7], identificador_leitura[6];

	//Verifica se o arquivo existe
	file = fopen(DATABASE_USUARIOS, "r");
	if (file)
	{
		//Busca o arquivo ate encontrar o identificador
		while (1)
		{
			Ler_Usuario_BD(file, nome_leitura, senha_leitura, identificador_leitura);
			if (feof(file))
				break;
			identificador = atoi(identificador_leitura);
			if ((!strcmp(nome_leitura, nome_de_usuario)) && (!strcmp(senha_leitura, senha)))
			{
				achou = true;
				break;
			}
		}
	}

	if (!achou)
		identificador = -1;

	fclose(file);

	return identificador;
}

int alterar_cadastro_persistencia(char nome_de_usuario[11], char senha[7], char novo_nome_de_usuario[11], char nova_senha[7])
{
	FILE *file;
	int identificador;
	bool achou = false;
	char nome_leitura[11], senha_leitura[7], identificador_leitura[6];

	//Verifica se o arquivo existe
	file = fopen(DATABASE_USUARIOS, "r+");
	if (file)
	{
		//Busca o arquivo ate encontrar o identificador
		while (1)
		{
			Ler_Usuario_BD(file, nome_leitura, senha_leitura, identificador_leitura);
			if (feof(file)){
				break;
			}
			identificador = atoi(identificador_leitura);
			if ((!strcmp(nome_leitura, nome_de_usuario)) && (!strcmp(senha_leitura, senha)))
			{
				achou = true;
				break;
			}
		}
	}

	//Verifica se encontrou o identificador e sobreescreve os dados do usuario
	if (!achou){
        fclose(file);
		identificador = -1;
	}
	else
	{
		//Escreve os dados atualizados e apaga os dados anteriores
		fclose(file);
		encerrar_cadastro_persistencia(nome_de_usuario, senha);
		file = fopen(DATABASE_USUARIOS, "r+");
		fseek(file, 0, SEEK_END);
		fprintf(file, "%s\t%s\t%d\t\n", novo_nome_de_usuario, nova_senha, identificador);
		fclose(file);
	}

	return identificador;
}

int encerrar_cadastro_persistencia(char nome_de_usuario[11], char senha[7])
{
	FILE *file, *file_aux;
	int identificador = -1;
	bool achou = false, escreveu = false;
	char nome_leitura[11], senha_leitura[7], identificador_leitura[6];

	file_aux = fopen(DATABASE_USUARIOS_AUXILIAR, "w");
	file = fopen(DATABASE_USUARIOS, "r");

	//Verifica se o arquivo existe
	if (file)
	{
		//Escreve os registros no arquivo auxiliar com excecao do registro que deseja excluir
		while (1)
		{
			Ler_Usuario_BD(file, nome_leitura, senha_leitura, identificador_leitura);
			if (feof(file))
				break;
			identificador = atoi(identificador_leitura);
			if ((!strcmp(nome_leitura, nome_de_usuario)) && (!strcmp(senha_leitura, senha)))
				achou = true;
			else
			{
				escreveu = true;
				fprintf(file_aux, "%s\t%s\t%d\t\n", nome_leitura, senha_leitura, identificador);
			}
		}
	} else
		printf("\nNao foi possivel abrir o Banco de Dados.\n");

	if (!achou)
		identificador = -1;

	fclose(file);
	fclose(file_aux);


	//Reescreve o arquivo com os registros sem a linha desejada
	file_aux = fopen(DATABASE_USUARIOS_AUXILIAR, "r");
	file = fopen(DATABASE_USUARIOS, "w");



	//Verifica se o arquivo existe
	if (file_aux)
	{
		if (escreveu)
		{
			//Escreve os registros do arquivo auxiliar no arquivo principal
			while (1)
			{
				Ler_Usuario_BD(file_aux, nome_leitura, senha_leitura, identificador_leitura);
				if (feof(file_aux))
					break;
				identificador = atoi(identificador_leitura);
				fprintf(file, "%s\t%s\t%d\t\n", nome_leitura, senha_leitura, identificador);
			}
		}
	} else
		printf("\nOcorreu um erro no Banco de Dados.\n");

	fclose(file);
	fclose(file_aux);

	//Limpa o arquivo auxiliar
	file_aux = fopen(DATABASE_USUARIOS_AUXILIAR, "w");
	fclose(file_aux);

	return identificador;
}



Usuario* listar_usuarios_persistencia()
{
	FILE *file;
	bool primeira_leitura = true;
	char nome_leitura[11], senha_leitura[7], identificador_leitura[6];
	Usuario *usuario, *aux;

	usuario = (Usuario*) malloc(sizeof(Usuario));
	aux = usuario;

	//Verifica se o arquivo existe
	file = fopen(DATABASE_USUARIOS, "r");
	if (file)
	{
		//Busca o arquivo ate encontrar o identificador
		while (1)
		{
			Ler_Usuario_BD(file, nome_leitura, senha_leitura, identificador_leitura);
			if (feof(file))
			{
				usuario->prox = NULL;
				break;
			}
			else
			{
				if (!primeira_leitura)
				{
					usuario->prox = (Usuario*) malloc(sizeof(Usuario));
					usuario = usuario->prox;
				}
				else
					primeira_leitura = false;
			}
			//Passa os valores para a estrutura de dados
			strcpy (usuario->nome_de_usuario, nome_leitura);
			strcpy (usuario->senha, senha_leitura);
			usuario->identificador = atoi(identificador_leitura);
		}
	}
	fclose(file);

	return aux;
}


